package day9;
//synchronized实现多线程购买商品
//两个线程 都想去购买100个商品
//商品总数只有100个
//而且两个线程必须轮流购买

//锁对象.wait()  当线程等待 需要别人唤醒 释放对象锁
//锁对象.notify()  唤醒随机一个
//锁对象.notifyAll()   唤醒全部的
public class Demo4 {
    int sum=100;
    public synchronized void buy(){ //高新分店
        String name=Thread.currentThread().getName();
        if(sum>0) {
            sum--;
            System.out.println(name + "购买了商品,剩余:" + sum + "个");
        }
        try {
            this.notifyAll(); //唤醒全部的
            this.wait();//等待了  释放锁
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        Demo4 d=new Demo4();
        new Thread(()->{
            for(int i=0;i<100;i++) {
                d.buy();  //this--->d
            }
        },"建勇").start();
        new Thread(()->{
            for(int i=0;i<100;i++){
                //青山湖分店
                synchronized (d) {
                    String name = Thread.currentThread().getName();
                    if (d.sum > 0) {
                        d.sum--;
                        System.out.println(name + "购买了商品,剩余:" + d.sum + "个");
                    }
                    try {
                        d.notifyAll(); //唤醒全部的
                        d.wait();//等待了  释放锁
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        },"易聪").start();
    }
}
